package com.demo.arch.datapulsedemo.common;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.List;

/**
 * 通知接收人查询条件
 * 
 * 根据多维度条件查询接收人：
 * - 报表类型
 * - 数据量级
 * - 金额范围
 * - 业务状态
 * - 自定义标签
 * 
 * @author DataPulse Team
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NotificationQueryCondition {

  /**
   * 报表类型（必填）
   */
  private String reportType;

  /**
   * 数据总量
   */
  private Integer dataCount;

  /**
   * 订单总金额
   */
  private BigDecimal totalAmount;

  /**
   * 最大单笔金额
   */
  private BigDecimal maxAmount;

  /**
   * 异常数据量（如取消订单数）
   */
  private Integer abnormalCount;

  /**
   * 业务部门
   */
  private String department;

  /**
   * 优先级（高、中、低）
   */
  private String priority;

  /**
   * 自定义标签
   */
  private List<String> tags;

  /**
   * 是否需要审批
   */
  private Boolean needApproval;

  /**
   * 便捷构建方法：从数据列表构建
   */
  public static NotificationQueryCondition fromData(String reportType, List<OrderData> orderData) {
    BigDecimal totalAmount = orderData.stream()
        .map(OrderData::getAmount)
        .reduce(BigDecimal.ZERO, BigDecimal::add);

    BigDecimal maxAmount = orderData.stream()
        .map(OrderData::getAmount)
        .max(BigDecimal::compareTo)
        .orElse(BigDecimal.ZERO);

    long abnormalCount = orderData.stream()
        .filter(order -> "已取消".equals(order.getStatus()))
        .count();

    return NotificationQueryCondition.builder()
        .reportType(reportType)
        .dataCount(orderData.size())
        .totalAmount(totalAmount)
        .maxAmount(maxAmount)
        .abnormalCount((int) abnormalCount)
        .build();
  }
}
